﻿using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace Infrastructure.Coding
{
    public class Encryption
    {
        private const string encryptionKey = "&%#@?,:*";
        
        /// <summary>
        /// Thsi method retrieve the string to encrypt from the Presentation Layer
        /// And return the Encrypted String
        /// </summary>
        /// <param name="strText"></param>
        /// <returns></returns>
        public string encryptPassword(string strText)
        {
            return Encrypt(strText, encryptionKey);
        }

        /// <summary>
        /// This method retrieve the encrypted string to decrypt from the Presentation Layer
        /// And return the decrypted string
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public string decryptPassword(string str)
        {
            return Decrypt(str, encryptionKey);
        }

        /// <summary>
        /// This method has been used to get the Encrypetd string for the
        /// passed string
        /// </summary>
        /// <param name="strText"></param>
        /// <param name="strEncrypt"></param>
        /// <returns></returns>
        private static string Encrypt(string strText, string strEncrypt)
        {

            byte[] byKey = new byte[20];
            byte[] dv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
            try
            {
                byKey = Encoding.UTF8.GetBytes(strEncrypt.Substring(0, 8));
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                byte[] inputArray = Encoding.UTF8.GetBytes(strText);

                MemoryStream ms = new MemoryStream();
                
                CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, dv), CryptoStreamMode.Write);
                cs.Write(inputArray, 0, inputArray.Length);
                cs.FlushFinalBlock();

                return Convert.ToBase64String(ms.ToArray());
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        /// <summary>
        /// This method has been used to Decrypt the Encrypted String
        /// </summary>
        /// <param name="strText"></param>
        /// <param name="strEncrypt"></param>
        /// <returns></returns>
        private static string Decrypt(string strText, string strEncrypt)
        {

            byte[] bKey = new byte[20];
            byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
            try
            {
                bKey = Encoding.UTF8.GetBytes(strEncrypt.Substring(0, 8));

                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                Byte[] inputByteArray =Convert.FromBase64String(strText);

                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(bKey, IV), CryptoStreamMode.Write);

                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();

                Encoding encoding = Encoding.UTF8;
                return encoding.GetString(ms.ToArray());
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }
}